package app.species;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * TODO: IMPLEMENT this feature in the mateCreatures() method. 
 * TODO: How to mutate non primitive attributes? Create interface mutable for every mutable non-primitive attribute
 * TODO: What about merging two Mutables from Parents to one new Mutable?  
 * 
 * Every attribute of the creature that
 * mutates has to declare this annotation "mutable"
 * 
 * @author Ben
 * 
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MutableField {
	/**
	 * Ignore the mutable attribute
	 * 
	 * @return
	 */
	boolean ignore() default false;

	/**
	 * Probability that a mutation will take place
	 * 
	 * @return
	 */
	float probability() default 0.08f;

	/**
	 * Amount in percentage that will be changed (roughly). 0.03 would take
	 * a +-3% change per mutation
	 * 
	 * @return
	 */
	float relativeImpact() default 0.05f;

	float minValue() default 0;

	float maxValue();
	
	/**
	 * not used yet
	 * @return
	 */
	float defaultValue() default 0;
}